package com.cizzy.api.filter;

import cn.hutool.core.util.StrUtil;
import com.cizzy.api.config.CizzyFinal;
import jakarta.annotation.Resource;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {
    @Resource
//    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    public AuthGatewayFilterFactory() {
        super(Config.class);
    }

//    @Override
//    public GatewayFilter authFilter() {
//        return (exchange, chain) -> {
//            // 在这里编写你的鉴权逻辑，可以检查请求头、令牌、用户身份等
//            // 如果鉴权通过，继续执行过滤器链
//            // 如果鉴权失败，可以返回一个错误响应或者重定向到登录页面
//            // 以下示例是一个简单的演示
//
//            String authToken = exchange.getRequest().getHeaders().getFirst("Authorization");
//
//            if (isValidAuthToken(authToken)) {
//                // 鉴权通过，继续执行过滤器链
//                return chain.filter(exchange);
//            } else {
//                // 鉴权失败，返回错误响应
//                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//                return exchange.getResponse().setComplete();
//            }
//        };
//    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            // 在这里编写你的鉴权逻辑，可以检查请求头、令牌、用户身份等
            // 如果鉴权通过，继续执行过滤器链
            // 如果鉴权失败，可以返回一个错误响应或者重定向到登录页面
            // 以下示例是一个简单的演示

            String authToken = exchange.getRequest().getHeaders().getFirst("Authorization");

            if (isValidAuthToken(authToken)) {
                // 鉴权通过，继续执行过滤器链
                return chain.filter(exchange);
            } else {
                // 鉴权失败，返回错误响应
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                return exchange.getResponse().setComplete();
            }
        };
    }


    //    @Override
    private boolean isValidAuthToken(String authToken) {
        // 在这里实现验证令牌的逻辑，可以是JWT验证、数据库查询等
        // 这里只是一个示例
        String userId = stringRedisTemplate.opsForValue().get(CizzyFinal.CIZZY_USER_GETID + authToken);
        return !StrUtil.isBlank(userId);
//        return authToken != null && authToken.startsWith("Bearer ");
    }

    @Validated
    public static class Config {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}
